/*        
	Copyright (C) 2010- Peer internet solutions

	Copyright (C) 2013 Pontificia Universidad Catolica del Peru
	contact: http://avatar.inf.pucp.edu.pe/realidad-aumentada/
	address contact: Av. Universitaria 1801, San Miguel, Lima-Peru.

	This file is part of UbicAR PUCP.
	
	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with This program.  If not, see <http://www.gnu.org/licenses/>.
*/
/*
	Modified by: Pedro Carrión Castagnola
	Pontificia Universidad Catolica del Peru
	Direccion de Informatica Academica

	Modified by: Alvaro Roger Agüero Sánchez, Rodolfo Javier Galvez Meza
	Pontificia Universidad Catolica del Peru
	Departamento de Ingeniería
*/

package org.grupoavatar.guiaubicua.mix;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.Locale;

import org.grupoavatar.guiaubicua.VBusqueda;
import org.grupoavatar.guiaubicua.VInicial;
import org.grupoavatar.guiaubicua.auxiliares.Servicio;
import org.grupoavatar.guiaubicua.auxiliares.Utiles;
import org.grupoavatar.guiaubicua.entidades.ARMarker;
import org.grupoavatar.guiaubicua.entidades.MarkerComparator;
import org.grupoavatar.guiaubicua.mix.data.DataHandler;
import org.grupoavatar.guiaubicua.mix.data.DataSource;
import org.grupoavatar.guiaubicua.mix.data.Encuesta;
import org.grupoavatar.guiaubicua.mix.data.Servicios;
import org.grupoavatar.guiaubicua.mix.data.DataSource.DATAFORMAT;
import org.grupoavatar.guiaubicua.mix.data.DataSource.DATASOURCE;
import org.grupoavatar.guiaubicua.mix.gui.PaintScreen;
import org.grupoavatar.guiaubicua.mix.gui.RadarPoints;
import org.grupoavatar.guiaubicua.mix.gui.ScreenLine;
import org.grupoavatar.guiaubicua.mix.render.Camera;

import android.graphics.Color;
import android.location.Location;
import android.util.Log;

import org.grupoavatar.guiaubicua.R;

public class DataView {

	public int getEstado() {
		return state.nextLStatus;
	}

	public MixState getState() {
		return state;
	}
	
	public static boolean viendoUnicoMarker = false;
	public static boolean actualizarMarkers = false; //no de BD, solo utilizar markers actuales (se utiliza cuando se ve Vmapa o VAR cuando provienen de VLista)
	public static boolean enBusqueda = false;
	public static boolean volverInicio = false;
//	public static boolean volverAFiltro = false; //si se ha buscado por categorÃ­as y estas no tienen contenido, se regresa a la pantalla de filtros y se muestra un mensaje
	
	/** current context */
	private MixContext mixContext;

	/** is the view Inited? */
	private boolean isInit;

	/** width and height of the view */
	private int width, height;

	/**
	 * _NOT_ the android camera, the class that takes care of the transformation
	 */
	private Camera cam;

	private MixState state = new MixState();

	/** The view can be "frozen" for debug purposes */
	private boolean frozen;

//	/** how many times to re-attempt download */
//	private int retry;

	private Location curFix;
	private DataHandler dataHandler = new DataHandler();
	private float radius;

	private boolean isLauncherStarted;

	private ArrayList<UIEvent> uiEvents = new ArrayList<UIEvent>();

	private RadarPoints radarPoints = new RadarPoints();
	private ScreenLine lrl = new ScreenLine();
	private ScreenLine rrl = new ScreenLine();
	private float rx = 10, ry = 20;
//	private float addX = 0, addY = 0;
//	private int frames = 0;

	private int TUltimo;

	/**
	 * Constructor
	 */
	public DataView(MixContext ctx) {
		this.mixContext = ctx;
	}

	public MixContext getContext() {
		return mixContext;
	}

	public boolean isLauncherStarted() {
		return isLauncherStarted;
	}

	public boolean isFrozen() {
		return frozen;
	}

	public void setFrozen(boolean frozen) {
		this.frozen = frozen;
	}

	public void changeState(int newState) {
		int oldState = state.nextLStatus;
		state.nextLStatus = newState;
		Log.d(VInicial.TAG + "-HILO", "Cambio de Estado de " + oldState + " a " + newState);
	}

	public float getRadius() {
		return radius;
	}

	public void setRadius(float radius) {
		this.radius = radius;
	}

	public DataHandler getDataHandler() {
		return dataHandler;
	}

	public boolean isDetailsView() {
		return state.isDetailsView();
	}

	public void setDetailsView(boolean detailsView) {
		state.setDetailsView(detailsView);
	}

	public void doStart() {
		Log.v(VInicial.TAG, "DO START STATE: " + state.nextLStatus);
		if (state.nextLStatus != MixState.DONE) {
			state.nextLStatus = MixState.NOT_STARTED;
		}
		mixContext.setLocationAtLastDownload(curFix);
	}

	public boolean isInited() {
		return isInit;
	}

//	public void initCamera(int widthInit, int heightInit) {
//		try {
//			width = widthInit;
//			height = heightInit;
//
//			cam = new Camera(width, height, true);
//			
//		} catch (Exception ex) {
//			ex.printStackTrace();
//		}
//	}
	
	public void init(int widthInit, int heightInit)  {
		try {
			width = widthInit;
			height = heightInit;
			cam = new Camera(width, height, true);
			cam.setViewAngle(Camera.DEFAULT_VIEW_ANGLE);
			lrl.set(0, -RadarPoints.RADIUS);
			lrl.rotate(Camera.DEFAULT_VIEW_ANGLE / 2);
			lrl.add(rx + RadarPoints.RADIUS, ry + RadarPoints.RADIUS);
			rrl.set(0, -RadarPoints.RADIUS);
			rrl.rotate(-Camera.DEFAULT_VIEW_ANGLE / 2);
			rrl.add(rx + RadarPoints.RADIUS, ry + RadarPoints.RADIUS);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		frozen = false;
		isInit = true;
	}

	public void requestData(String url, DATAFORMAT dataformat,
			DATASOURCE datasource) {
		DownloadRequest request = new DownloadRequest();
		request.format = dataformat;
		request.source = datasource;
		request.url = url;
		mixContext.getDownloader().submitJob(request);
	}
	
	public void requestData(String url, DATAFORMAT dataformat) {
		DownloadRequest request = new DownloadRequest();
		request.format = dataformat;
		request.source = null;
		request.url = url;
		mixContext.getDownloader().submitJob(request);
	}
	
	public void requestEncuesta(String idpoi) {
		//se debe usar "idpoi" para consultar.
		//String url =  "file://sdcard/guiaUbicuaPUCP/encuestaX.json";
		String url = Utiles.getEncuestaURL(idpoi);
		DownloadRequest request = new DownloadRequest();
		request.format = null;
		request.source = null;
		request.url = url;
		mixContext.getDownloader().submitJob(request);
	}

	public void reiniciarAlturas() {
		for (int i = 0; i < dataHandler.getMarkerCount(); i++) {
			Marker ma = dataHandler.getMarker(i);
			ma.addY = 0;
			ma.alturaEstablecida = false;
			//AGREGADO
			ma.obstruido = true;
			ma.clearObstruidos();
		}
	}
	
	public void draw(PaintScreen dw) {
		mixContext.getRM(cam.transform);
		curFix = mixContext.getCurrentLocation();
		state.calcPitchBearing(cam.transform);
//		/*frames por segundo*/
		int segundos = 2; //cambie 3 por 2
//		frames ++;
		int Tactual = Calendar.getInstance().get(Calendar.SECOND);
		if (Tactual < TUltimo)	{
			TUltimo = TUltimo - 60;
		}
		if (Tactual - TUltimo > segundos)	{
//			Log.d(VInicial.TAG, "FPS: " + frames);
//			Log.d(VInicial.TAG, "FPS: act:" + Tactual + "ult" + TUltimo);
//			frames = 0;
////			Log.d(VInicial.TAG,"*************************");
////			for (int i = 0; i <= dataHandler.getMarkerCount() - 1; i++) {
////				Marker ma = dataHandler.getMarker(i);
////				if (ma.isVisible)//ma.isLookingAt
////					Log.d(VInicial.TAG,"visible:" + ma.getTitle());
////				else
////					Log.d(VInicial.TAG,"NO visible:" + ma.getTitle());
////			}
////			Log.d(VInicial.TAG,"*************************");
			reiniciarAlturas();
			TUltimo = Tactual;
		}
		/*
		 *	Hasta aquÃ­ se controla el tiempo de refresco (definido por "segundos") tras el cual se llamarÃ¡ a "reiniciarAlturas" que setearÃ¡
		 *	los addY como 0 y le darÃ¡ al atributo "alturaEstablecida" el valor de falso  
		 */
		List<Marker> mActivos = new ArrayList<Marker>();
		float tamanoCirculo = dw.getHeight() / 20f; 
													// es el
													// tamaÃ±o del circulo,
													// obtenido de funcion
													// drawcircle
		float tamanoPOIY = (tamanoCirculo) * 2;		
		float tamanoPOIX = 115;	//150 x 110 para mostrar mas cosas
		//COMENTADO DEBIDO A QUE SE DEJO DE USAR LA VARIABLE
		//boolean dibujarArriba = true; // por traslape
		List<Marker> aDibujar = new ArrayList<Marker>();
		for (int i = 0; i < dataHandler.getMarkerCount(); i++) {			
			Marker ma = dataHandler.getMarker(i);			
			if (ma.isActive() && (ma.getDistance() / 1000f < radius)) { //esta activo y esta en una distancia de visualizaciÃ³n				
				/*
				if (ma.alturaEstablecida)	{
					ma.calcPaint(cam, 0, ma.addY); // se actualizan las coordenadas de dibujo					
				}
				else	{
					ma.calcPaint(cam, 0, 0); // se actualizan las coordenadas de dibujo										
				}
				*/
				//ma.addY = 0;
				ma.calcPaint(cam, 0, 0);
				//ma.calcPaint(cam, 0, ma.addY);
				if (ma.isVisible)	{		
					if (!ma.alturaEstablecida)	{
						//ma.addY = 0;
						//COMENTADO DEBIDO A QUE SE DEJO DE USAR LA VARIABLE
						//boolean huboTraslape = false;
						if (mActivos.size() > 0) {
							for (int j = 0; j < mActivos.size(); j++) {
								if (esAproximado(tamanoPOIX, mActivos.get(j).cMarker.x,
										ma.cMarker.x)
										&& esAproximado(tamanoPOIY,
												mActivos.get(j).cMarker.y, ma.cMarker.y)) {
									// si hay traslape
									//COMENTADO DADO QUE NO SE USA VARIABLE
									//huboTraslape = true;
									
									// cambio las coordenadas de dibujo de este marker								
									//COMENTADO DEBIDO A QUE los casos excluyentes tienen como consecuencia la misma asignacion
									/*
									if (dibujarArriba) {
										ma.addY -= tamanoCirculo * 6;
									}
									else {
										ma.addY -= tamanoCirculo * 6;								
									} 
									ma.calcPaint(cam, 0, ma.addY);
									*/
									//COMENTADO DEBIDO A QUE YA NO SE APLICARÃ� UN CAMBIO DE ALTURA
									//ma.addY -= tamanoCirculo * 6;								
									/*	NOTA:
									 *	Cuando se le resta al addY, se le esta aumentado la coordenada Y 
									*/	
									//ma.calcPaint(cam, 0, ma.addY);
									if (!mActivos.get(j).obstruido) 
									{
										ma.obstruido = true;
										mActivos.get(j).anadirObstruido(ma);
										break;						
									}
								} else {								
									ma.obstruido=false;								
								}
							}
						} else {
							ma.obstruido=false;
						}
						//COMENTADO DEBIDO A QUE huboTraslape actualiza dibujarArriba y se determino que dibujarArriba es 
						//irrelevante
						/*
						if (huboTraslape)	{
							dibujarArriba = dibujarArriba ? false : true;
						}
						*/
						ma.alturaEstablecida = true;
						//alturaEstablecida cambia debido a que ya se analizÃ³ si  hace traslape o no
					}										
					/*	PARA EL LUNES:
					 * 	- Cambiar la estructura de esta iteracciÃ³n para que el arreglo mActivos cambie de tal forma que almacene solo los puntos a 
					 * 	  mostrarse.
					 * - El mÃ©todo draw aplica solo a los puntos de ese arreglo de visibles (activos, en rango y que no sean superpuestos.
					 */
						mActivos.add(ma);
						//ma.draw(dw);
						aDibujar.add(ma);
				}
			}
		}
		for (int i = aDibujar.size()-1; i >=0; i--) {			
			aDibujar.get(i).draw(dw);			
		}
		// Draw Radar
		String dirTxt = "";
		int bearing = (int) state.getCurBearing();
		int range = (int) (state.getCurBearing() / (360f / 16f));

		if (range == 15 || range == 0)
			dirTxt = "N";
		else if (range == 1 || range == 2)
			dirTxt = "NE";
		else if (range == 3 || range == 4)
			dirTxt = "E";
		else if (range == 5 || range == 6)
			dirTxt = "SE";
		else if (range == 7 || range == 8)
			dirTxt = "S";
		else if (range == 9 || range == 10)
			dirTxt = "SO";
		else if (range == 11 || range == 12)
			dirTxt = "O";
		else if (range == 13 || range == 14)
			dirTxt = "NO";

		radarPoints.view = this;
		RadarPoints.setRadarColor(mixContext.getResources().getColor(
				R.color.fondo_radar));
		dw.paintObj(radarPoints, rx, ry, -state.getCurBearing(), 1, true);
		dw.setFill(false);
		dw.setColor(mixContext.getResources().getColor(R.color.lineas_radar));
		dw.paintLine(lrl.x, lrl.y, rx + RadarPoints.RADIUS, ry
				+ RadarPoints.RADIUS);
		dw.paintLine(rrl.x, rrl.y, rx + RadarPoints.RADIUS, ry
				+ RadarPoints.RADIUS);
		dw.setColor(Color.rgb(255, 255, 255));
		dw.setFontSize(12);

		radarText(dw, MixUtils.formatDist(radius * 1000), rx
				+ RadarPoints.RADIUS, ry + RadarPoints.RADIUS * 2 - 10, false);
		radarText(dw, "" + bearing + ((char) 176) + " " + dirTxt, rx
				+ RadarPoints.RADIUS, ry - 5, true);

		// Get next event
		UIEvent evt = null;
		synchronized (uiEvents) {
			if (uiEvents.size() > 0) {
				evt = uiEvents.get(0);
				uiEvents.remove(0);
			}
		}
		if (evt != null) {
			switch (evt.type) {

			case UIEvent.CLICK:
				handleClickEvent((ClickEvent) evt);
				break;
			}
		}
	}

	private boolean esAproximado(float tamanoPOI, float x, float x2) {
		return (Math.abs(x2 - x) < tamanoPOI) ? true : false;
	}

	boolean handleClickEvent(ClickEvent evt) {
		boolean evtHandled = false;

		for (int i = 0; i < dataHandler.getMarkerCount() && !evtHandled; i++) {
			Marker pm = dataHandler.getMarker(i);
			if (pm.isVisible)
				evtHandled = pm.fClick(evt.x, evt.y, mixContext, state);
		}
		return evtHandled;
	}

	void radarText(PaintScreen dw, String txt, float x, float y, boolean bg) {
		float padw = 4, padh = 2;
		float w = dw.getTextWidth(txt) + padw * 2;
		float h = dw.getTextAsc() + dw.getTextDesc() + padh * 2;
		if (bg) {
			dw.setColor(Color.rgb(0, 0, 0));
			dw.setFill(true);
			dw.paintRect(x - w / 2, y - h / 2, w, h);
			dw.setColor(Color.rgb(255, 255, 255));
			dw.setFill(false);
			dw.paintRect(x - w / 2, y - h / 2, w, h);
		}
		dw.paintText(padw + x - w / 2, padh + dw.getTextAsc() + y - h / 2, txt,
				false);
	}

	public void clickEvent(float x, float y) {
		synchronized (uiEvents) {
			uiEvents.add(new ClickEvent(x, y));
		}
	}

	public void keyEvent(int keyCode) {
		synchronized (uiEvents) {
			uiEvents.add(new KeyEvent(keyCode));
		}
	}

	public void clearEvents() {
		synchronized (uiEvents) {
			uiEvents.clear();
		}
	}

	public Marker getMarker(String idPOI, DATAFORMAT format) {

		String url = DataSource.createRequestURL(DataSource.DATASOURCE.BYID, 0,
				0, 0, radius, idPOI);
		requestData(url, format, DataSource.DATASOURCE.BYID);

		DownloadResult result = mixContext.getDownloader().getDefaultMarkers();
		if (!result.error) {
			List<Marker> lm = result.getMarkers();
			if (lm != null && lm.size() == 1) {
				return lm.iterator().next();
			}
		}

		return null;
	}

//original
//	public List<Marker> setDefaultMarkerList() {
//		this.changeState(MixState.PROCESSING);
//		
//		boolean hayMarker = false;
//		dataHandler.setMarkerListForSearch(null);
//		VBusqueda.hayBusqueda = false;
//		dataHandler.clearMarkers();
//		for (DataSource.DATASOURCE source : DataSource.DATASOURCE.values()) {
//			if (mixContext.isDataSourceSelected(source)) {
//				// String uno =
//				// DataSource.createRequestURL(source,0,0,0,radius,Locale.getDefault().getLanguage());
//				// DATAFORMAT dos = DataSource.dataFormatFromDataSource(source);
//				// requestData(uno,dos,source);
//
//				requestData(DataSource.createRequestURL(source, 0, 0, 0, radius, Locale.getDefault().getLanguage()), DataSource.dataFormatFromDataSource(source), source);
//				
//				// Debug notification
//				// Toast.makeText(mixContext, "Downloading from "+ source,
//				// Toast.LENGTH_SHORT).show();
//
//				DownloadResult result = mixContext.getDownloader()
//						.getDefaultMarkers();
//				if (result != null)
//					if (!result.error) {
//						hayMarker = true;
//						dataHandler.addMarkers(result.getMarkers());
//					}
//			}
//		}
//		if (hayMarker) {
//			dataHandler.updateActivationStatus(mixContext);
//			this.changeState(MixState.DONE);
//			//dataHandlerAlter = dataHandler; //CLONAR!
//			return dataHandler.getMarkerList();
//		}
//		this.changeState(MixState.NOT_STARTED);
//		return null;
//	}
	
	
//modificado
	public List<Marker> setDefaultMarkerList() {
		this.changeState(MixState.PROCESSING);
		
		boolean hayMarker = false;
		
		if (dataHandler.getMarkerListTotal() == null || dataHandler.getMarkerListTotal().size() == 0) {
			requestData(DataSource.createRequestURL(null, 0, 0, 0,
					radius, Locale.getDefault().getLanguage()),
					DataSource.DATAFORMAT.LUGARES);
			
			DownloadResult result = mixContext.getDownloader()
					.getDefaultMarkers();
			if (result != null)
				if (!result.error) {
					hayMarker = true;
					dataHandler.setMarkerListTotal(result.getMarkers());
					dataHandler.relacionarMarkers();
				}
		}
		
		
		dataHandler.addMarkers(applyCatFilter(dataHandler.getMarkerListTotal()));
		if (dataHandler.getMarkerList() != null) {
			hayMarker = true;
		}
		
		dataHandler.setMarkerListForSearch(null);
		VBusqueda.hayBusqueda = false;

		if (hayMarker) {
			dataHandler.updateActivationStatus(mixContext);
			this.changeState(MixState.DONE);
			//dataHandlerAlter = dataHandler; //CLONAR!
			return dataHandler.getMarkerList();
		}
		this.changeState(MixState.NOT_STARTED);
		return null;
	}
	
	public Encuesta getEncuesta(String id) {
		this.changeState(MixState.PROCESSING);
		boolean hayEncuesta = false;
		requestEncuesta(id);
		DownloadResult result = mixContext.getDownloader().getEncuesta();
		if (result != null)
			if (!result.error) {
				if (result.getEncuesta() != null)
					hayEncuesta = true;
				dataHandler.setEncuesta(result.getEncuesta());
			}

		if (hayEncuesta) {
			dataHandler.updateActivationStatus(mixContext);
			this.changeState(MixState.DONE);
			return dataHandler.getEncuesta();
		}
		
		this.changeState(MixState.NOT_STARTED);
		return null;
	}
	
	public List<Marker> applyCatFilter(List<Marker> total) {
		if (total != null) {
			Servicios.atLeastOneServiceSelected = false;
			
			for(Servicios.DATASOURCE source: Servicios.DATASOURCE.values()) {
				if (mixContext.isServiceSelected(source)) {
					Servicios.atLeastOneServiceSelected = true;
					break;
				}
			}
			
			List<Marker> temp = new ArrayList<Marker>();
			Marker ma;
			for (int i = 0; i < total.size(); i++) {
				ma = total.get(i);
				if (ma.getDatasource() != null) {
					if (mixContext.isDataSourceSelected(ma.getDatasource())) {
						if(!Servicios.atLeastOneServiceSelected) { //ningun servicio seleccionado
							temp.add(ma);
						}
						else { //al menos un servicio seleccionado
							ArrayList<Servicio> serv = ma.getServicios();
							if ((serv != null) && (serv.size() > 0)) {
								int size = serv.size();
								int j = 0;
								boolean valido = false;
								while (j < size && !valido) {
									if (mixContext.isServiceSelected(serv.get(j).getServicio()))
										valido = true;
									j++;
								}
								
								if (valido)
									temp.add(ma);
							}
						}
					}
				}
			}
			
			return temp;
		} else
			return null;
	}

	public List<Marker> setSearchMarkerList(String textoBusqueda) {

		this.changeState(MixState.PROCESSING);

		ArrayList<Marker> searchResults = new ArrayList<Marker>();
		ArrayList<Marker> resultadosNombreInicial = new ArrayList<Marker>();
		ArrayList<Marker> resultadosNombreNoInicial = new ArrayList<Marker>();
		ArrayList<Marker> resultadosTag = new ArrayList<Marker>();
		ArrayList<Marker> resultadosDescripcion = new ArrayList<Marker>();
		
		if (VBusqueda.primeraConsulta) {
			VInicial.dataView.setDefaultMarkerList();
			try {
				if (VInicial.dataView.getDataHandler().getMarkerListTotal().size() > 0)
					VBusqueda.primeraConsulta = false;
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		String busquedaLowerCase = convertir(textoBusqueda);
		this.changeState(MixState.PROCESSING);
		
		List<Marker> completo;
		if (VBusqueda.hayBusqueda)
			completo = dataHandler.getMarkerListForSearch();
		else
			completo = dataHandler.getMarkerList();
		
		if (textoBusqueda.equals("")) {
			dataHandler.setMarkerList(completo);
			dataHandler.setMarkerListForSearch(completo);
		} else if ((dataHandler != null) && (completo != null)) {
			for (int i = 0; i < completo.size(); i++) {
				ARMarker ma = (ARMarker) completo.get(i);
				String convertidoNombre = convertir(ma.getTitle());
				int indiceNombre = convertidoNombre.indexOf(busquedaLowerCase);
				
				if (indiceNombre == 0) {
					resultadosNombreInicial.add(ma);
				} else if (indiceNombre > 0) {
					indiceNombre = convertidoNombre.indexOf(" " + busquedaLowerCase);
					if (indiceNombre >= 0) {
						resultadosNombreNoInicial.add(ma);
					} else if (buscarEnTags(busquedaLowerCase, ma)) {
						resultadosTag.add(ma);
					} else {
						String convertidoDescripcion = convertir(ma.getDes_Corta());
						int indiceDescripcion = convertidoDescripcion.indexOf(busquedaLowerCase);
						
						if (indiceDescripcion == 0) {
							resultadosDescripcion.add(ma);
						} else if (indiceDescripcion > 0) {
							indiceDescripcion = convertidoDescripcion.indexOf(" " + busquedaLowerCase);
							if (indiceDescripcion >= 0) {
								resultadosDescripcion.add(ma);
							}
						}
					}
				} else if (buscarEnTags(busquedaLowerCase, ma)) {
					resultadosTag.add(ma);
				} else {
					String convertidoDescripcion = convertir(ma.getDes_Corta());
					int indiceDescripcion = convertidoDescripcion.indexOf(busquedaLowerCase);
					
					if (indiceDescripcion == 0) {
						resultadosDescripcion.add(ma);
					} else if (indiceDescripcion > 0) {
						indiceDescripcion = convertidoDescripcion.indexOf(" " + busquedaLowerCase);
						if (indiceDescripcion >= 0) {
							resultadosDescripcion.add(ma);
						}
					}
				}
			}
			
			if (!VBusqueda.hayBusqueda)
				dataHandler.setMarkerListForSearch(dataHandler.getMarkerList());
			
			Collections.sort(resultadosNombreInicial, new MarkerComparator(MarkerComparator.ORDENAMIENTO_ALFABETICO));
			Collections.sort(resultadosNombreNoInicial, new MarkerComparator(MarkerComparator.ORDENAMIENTO_ALFABETICO));
			searchResults.addAll(resultadosNombreInicial);
			searchResults.addAll(resultadosNombreNoInicial);
			searchResults.addAll(resultadosTag);
			searchResults.addAll(resultadosDescripcion);
			dataHandler.setMarkerList(searchResults);
			
		}
		VBusqueda.hayBusqueda = true;
		dataHandler.updateActivationStatus(mixContext);
		this.changeState(MixState.DONE);
		
		return dataHandler.getMarkerList();
	}

	public boolean buscarEnTags(String cadenaBusqueda, ARMarker ma) {
		boolean valido = false;
		String listaPalabras[] = cadenaBusqueda.split(" ");
		int i = 0;
		
		while (i < ma.getTags().size() && !valido) {
			if (ma.getTags().get(i).indexOf(cadenaBusqueda) >= 0)
				valido = true;
			i++;
		}
		
		i = 0;
		
		while (i < listaPalabras.length && !valido) {
			int j = 0;
			while (j < ma.getTags().size() && !valido) {
				if (ma.getTags().get(j).indexOf(listaPalabras[i])>= 0)
					valido = true;
				j++;
			}
			i++;
		}
		
		return valido;
	}
	
	public void restaurarListaOriginal() {
		if (VBusqueda.hayBusqueda)
			dataHandler.setMarkerList(dataHandler.getMarkerListForSearch());
		
		dataHandler.setMarkerListForSearch(null);
	}
	
	public MixContext getMixContext() {
		// TODO Auto-generated method stub
		return mixContext;
	}
	
	public static String convertir(String nombre){
		String resultado = "";
		
		int tamanio = nombre.length();
		char caracter;
		for (int i = 0; i < tamanio; i++) {
			caracter = nombre.charAt(i);
			
			if ((caracter >= 'A') && (caracter <= 'Z')) {
				caracter += ('a'-'A');
			} else {
				switch(caracter) {
					case 'Á':	
					case 'á':	caracter = 'a';
								break;
								
					case 'É':	
					case 'é':	caracter = 'e';
								break;
								
					case 'Í':	
					case 'í':	caracter = 'i';
								break;
								
					case 'Ó':	
					case 'ó':	caracter = 'o';
								break;
								
					case 'Ú':	
					case 'ú':	caracter = 'u';
								break;
								
					default:	break;
				}
			}
			
			resultado += caracter;
		}
		
		return resultado;
	}

}

class UIEvent {
	public static final int CLICK = 0;
	public static final int KEY = 1;

	public int type;
}

class ClickEvent extends UIEvent {
	public float x, y;

	public ClickEvent(float x, float y) {
		this.type = CLICK;
		this.x = x;
		this.y = y;
	}

	@Override
	public String toString() {
		return "(" + x + "," + y + ")";
	}
}

class KeyEvent extends UIEvent {
	public int keyCode;

	public KeyEvent(int keyCode) {
		this.type = KEY;
		this.keyCode = keyCode;
	}

	@Override
	public String toString() {
		return "(" + keyCode + ")";
	}
}
